home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 2
/
CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso
/
magazine
/
amiga_e
/
modulesmc1
/
stringf.e
< prev
next >
Wrap
Text File
|
1994-11-21
|
8KB
|
377 lines
OPT MODULE
SET PAD,LEFT,FIELD
EXPORT PROC stringf(str:PTR TO CHAR, format:PTR TO CHAR,
dataptr=NIL:PTR TO LONG)
DEF tempstr[80]:ARRAY, left, right,
ch:REG, flag:REG, i:REG, j:REG, templen:REG
MOVEM.L A2/A4/A6,-(A7)
MOVEA.L str,A4
MOVEA.L format,A6
j20: /* REPEAT */
MOVE.B (A6),(A4)+ /* str[]++ := format[] */
nextformat:
MOVEQ #0,flag
MOVE.L flag,i
MOVE.L i,right
MOVE.L i,left
MOVE.B (A6),ch /* ch:=format[] */
CMPI.B #"%",ch /* IF ch="%" */
BNE.S endloop
nextch:
ADDQ.W #1,i
MOVEA.L A6,A0 /* ch:=format[i] */
ADDA.W i,A0
MOVE.B (A0),ch
/* SELECT ch */
CMPI.B #"l",ch /* CASE "l" */
BNE.S j30
BRA gotlong
j30: CMPI.B #"s",ch /* CASE "s" */
BNE.S j31
BRA.S gotstring
j31: CMPI.B #"-",ch /* CASE "-" */
BNE.S j32
ORI.B #LEFT,flag /* flag:=flag OR LEFT */
BRA.S nextch
j32: CMPI.B #"0",ch /* CASE "0" */
BNE.S j29
ORI.B #PAD,flag /* flag:=flag OR PAD */
BRA.S nextch
j29: /* DEFAULT */
CMPI.B #"0",ch /* IF (ch>"0") AND (ch<="9") */
BLE.S j21
CMPI.B #"9",ch
BGT.S j21
ORI.B #FIELD,flag /* flag:=flag OR FIELD; */
BRA field
j21: /* ELSE */
MOVE.B (A6)+,(A4)+ /* str[]++ := format[]++; */
BRA.S nextformat
/* ENDIF */
/* ENDSELECT */
endloop: /* ENDIF */
ADDQ.W #1,A6 /* format++ */
MOVE.B -1(A4),j /* UNTIL str[-1]=0 */
BNE.S j20
MOVE.L A4,D1
SUB.L str,D1
SUBQ.L #1,D1 /* string length */
MOVEA.L str,A0
CMP.W -4(A0),D1
BHI.S toolong
MOVE.W D1,-2(A0)
toolong:
MOVE.L A0,D0
MOVEM.L (A7)+,A2/A4/A6
BRA endstringf
gotstring:
ADDA.W i,A6 /* format:=format+i */
SUBQ.W #1,A4 /* str-- */
MOVEA.L dataptr,A0 /* streamstring:=dataptr[]++ */
MOVEA.L (A0),A3
ADDQ.L #4,dataptr
BTST #2,flag /* IF flag AND FIELD */
BEQ.S j15
MOVEA.L tempstr,A2 /* savetempstr:=tempstr */
MOVEQ #0,templen
j17: /* REPEAT */
MOVE.B (A3)+,(A2)+ /* savetempstr[]++ := streamstring[]++ */
ADDQ.L #1,templen /* templen++ */
MOVEQ #0,j
MOVE.B -1(A3),j /* UNTIL streamstring[-1]=0 */
BNE.S j17 /* UNTIL j=0 */
MOVEA.L tempstr,A2 /* savetempstr:=tempstr */
SUBQ.L #1,templen
CMP.L right,templen /* IF templen>right THEN templen:=right */
BLE.S j18
MOVE.L right,templen
j18: BSR dopad
BRA.S j16
j15: /* ELSE */
j19: /* REPEAT */
MOVE.B (A3)+,(A4)+ /* str[]++ := streamstring[]++ */
MOVE.B -1(A3),j /* UNTIL streamstring[-1]=0 */
BNE.S j19 /* UNTIL j=0 */
SUBQ.L #1,A4 /* str-- */
j16: /* ENDIF */
BRA.S endloop
gotlong:
ADDA.L i,A6 /* format:=format+i+1 */
ADDQ.L #1,A6
SUBQ.L #1,A4 /* str-- */
MOVE.B (A6),ch /* ch:=format[] */
/* SELECT ch */
CMPI.B #"d",ch /*CASE "d" */
BNE.S j25
MOVEA.L dataptr,A0 /* number:=dataptr[]++; */
MOVE.L (A0),D0
ADDQ.L #4,dataptr
BTST #2,flag /* IF flag AND FIELD */
BEQ.S j5
MOVEA.L tempstr,A2 /* savetempstr:=tempstr */
MOVE.L A2,A0
BSR decimal
MOVE.L A0,D0
SUB.L A2,D0
MOVE.L D0,templen
BSR dopad
BRA.S j6
/* ELSE */
j5: MOVEA.L A4,A0 /* MOVE.L str,A0 */
BSR decimal
MOVEA.L A0,A4 /* MOVE.L A0,str */
j6: /* ENDIF */
BRA j23
j25: /* CASE "x" */
CMPI.B #"x",ch
BNE.S j26
MOVEA.L dataptr,A0 /* number:=dataptr[]++; */
MOVE.L (A0),D0
ADDQ.L #4,dataptr
BTST #2,flag /* IF flag AND FIELD */
BEQ.S j7
MOVEA.L tempstr,A2 /* savetempstr:=tempstr */
MOVEA.L A2,A0 /* MOVEA.L savetempstr,A0 */
BSR hex
MOVE.L D0,templen
BSR.S dopad
BRA.S j8
j7: /* ELSE */
MOVEA.L A4,A0 /* MOVEA.L str,A0 */
BSR hex
MOVEA.L A0,A4 /* MOVE.L A0,str */
j8: /* ENDIF */
BRA.S j23
j26: /* CASE "c" */
CMPI.B #"c",ch
BNE.S j27
MOVEA.L dataptr,A0 /* str[]++:=dataptr[]++ */
ADDQ.L #4,dataptr
MOVE.B 3(A0),(A4)+ /* low byte of data */
BRA.S j23
j27: /* CASE "b"; */
CMPI.B #"b",ch
BNE.S j24 /* default */
MOVEA.L dataptr,A0 /* number:=dataptr[]++; */
ADDQ.L #4,dataptr
MOVE.L (A0),D0 /* sets flags for beq.s binzero below */
MOVEA.L tempstr,A2
MOVEA.L A2,A0 /* MOVEA.L savetempstr,A0 */
BEQ.S binzero
MOVEQ #31,D1
next0:
BTST D1,D0
DBNE D1,next0
nextbit:
BTST D1,D0
BEQ.S bit0
MOVE.B #"1",(A0)+
BRA.S bit1
bit0:
MOVE.B #"0",(A0)+
bit1:
DBRA D1,nextbit
BRA.S endbin
binzero:
MOVE.B #"0",(A0)+
endbin:
SUBA.L A2,A0 /* SUBA.L savetempstr,A0 */
MOVE.L A0,templen
BSR.S dopad
BRA.S j23
j24: /* DEFAULT */
/* str[]++ := "%"; str[]++ :="l"; str[]++ := ch */
MOVE.W #"%l",(A4)+
MOVE.B ch,(A4)+
j23: /*ENDSELECT */
BRA endloop
dopad:
CMP.L left,templen /* IF templen>=left */
BLT.S j13
MOVE.L templen,i
SUBQ.L #1,i
d1: MOVE.B (A2)+,(A4)+ /* str[]++ := savetempstr[]++ */
DBRA i,d1
BRA.S j14
j13: /* ELSE */
BTST #0,flag /* j:=IF flag AND PAD THEN "0" ELSE " " j is pad char */
BEQ.S j9
MOVEQ #"0",j
BRA.S j10
j9: MOVEQ #" ",j
j10:
BTST #1,flag /* IF flag AND LEFT */
BEQ.S j11
MOVE.L templen,i
SUBQ.L #1,i
d2: MOVE.B (A2)+,(A4)+ /* str[]++ := savetempstr[]++ */
DBRA i,d2
MOVE.L left,i
SUB.L templen,i
SUBQ.L #1,i
d3: MOVE.B j,(A4)+ /* str[]++:=padch */
DBRA i,d3
BRA.S j12
j11: /* ELSE */
MOVE.L left,i
SUB.L templen,i
SUBQ.L #1,i
d4: MOVE.B j,(A4)+ /* str[]++:=padch */
DBRA i,d4
MOVE.L templen,i
SUBQ.L #1,i
d5: MOVE.B (A2)+,(A4)+ /* str[]++ := savetempstr[]++ */
DBRA i,d5
j12: /* ENDIF */
j14: /* ENDIF */
RTS
field:
ANDI.B #$F,ch /* left:=ch-"0" */
MOVE.L ch,j
j1: MOVEA.L A6,A3
ADDA.L i,A3
CMPI.B #".",1(A3)
BEQ.S j2
MOVE.B 1(A3),ch
ANDI.B #$F,ch
ADDQ.L #1,i
MULU #10,j /* left:=10*left+ch-"0" */
ADD.L ch,j
BRA.S j1
j2: MOVE.L j,left
ADDQ.L #2,i
MOVEA.L A6,A3
ADDA.L i,A3
MOVE.B (A3),ch
ANDI.B #$F,ch /* right:=ch-"0" */
MOVE.B ch,j
j3: MOVEA.L A6,A3
ADDA.L i,A3
CMPI.B #"0",1(A3)
BLT.S j4
CMPI.B #"9",1(A3)
BGT.S j4
ADDQ.W #1,A6
MOVEA.L A6,A3
ADDA.L i,A3
MOVE.B (A3),ch /* right:=10*right+ch-"0" */
ANDI.B #$F,ch
MULU #10,j
ADD.L ch,j
BRA.S j3
j4: MOVE.L j,right
BRA nextch
decimal:
SUBA.W #14,A7
MOVEA.L A7,A3
MOVE.L D0,D2
BGE.S repeatbig
NEG.L D0
repeatbig:
CMPI.L #655359,D0
BHI.S bignumber
repeat:
MOVEQ #10,D1
CMP.L D1,D0
BHI.S norm
BEQ.S is1
MOVE.L D0,D1
MOVEQ #0,D0
BRA.S cont
norm:
DIVU D1,D0
SWAP D0
CLR.L D1
MOVE.W D0,D1
CLR.W D0
SWAP D0
cont:
ADDI.B #"0",D1
MOVE.B D1,(A3)+
TST.L D0
BGT.S repeat
TST.L D2
BGE.S notneg
MOVE.B #"-",(A3)+
notneg:
MOVE.B -(A3),(A0)+
CMPA.L A3,A7
BLT.S notneg
ADDA.W #14,A7
RTS
is1:
MOVEQ #1,D0
MOVEQ #0,D1
BRA.S cont
bignumber:
MOVEM.L D2/D3,-(A7)
MOVEQ #10,D1
MOVE.L D0,D2
CLR.W D2
SWAP D2
DIVU D1,D2
CLR.L D3
MOVE.W D2,D3
SWAP D3
MOVE.W D0,D2
DIVU D1,D2
MOVE.L D2,D1
CLR.W D1
SWAP D1
CLR.L D0
MOVE.W D2,D0
ADD.L D3,D0
ADD.B #"0",D1
MOVE.B D1,(A3)+
MOVEM.L (A7)+,D2/D3
BRA repeatbig
hex:
MOVEA.L A7,A3
SUBA.W #14,A3
MOVEQ #-1,D2
nextltr:
MOVE.B D0,D1
ANDI.B #$0F,D1
ADDI.B #48,D1
CMPI.B #57,D1
BLE.S around
ADDQ.B #7,D1
around:
MOVE.B D1,(A3)+
LSR.L #4,D0
DBEQ D2,nextltr
NOT.L D2
MOVE.L D2,D0
ADDQ.L #1,D0
loadstr:
MOVE.B -(A3),(A0)+ /* reverse buffer */
DBF D2,loadstr
RTS
endstringf:
ENDPROC D0